import numpy as np
import pywt
import matplotlib.pyplot as plt

def build_signal(n=600, noise_level=0.01):
    """
    构建具有平稳段、正弦上升、正弦下降、缓慢恢复和右侧小波包的一维信号。
    参数：
        n: 信号长度
        noise_level: 噪声强度
    返回：
        x: 自变量数组
        signal: 构建的一维信号
    """
    import numpy as np
    x = np.linspace(0, 1, n)
    signal = np.zeros(n)
    # 左侧平稳段
    signal[:180] = noise_level * np.random.randn(180)
    # 陡升（正弦上升）
    t1 = np.linspace(0, np.pi/2, 60)
    signal[180:240] = 1.2 * np.sin(t1) + noise_level * np.random.randn(60)
    # 陡降（正弦下降）
    t2 = np.linspace(np.pi/2, 3*np.pi/2, 80)
    signal[240:320] = 1.2 * np.sin(t2) + noise_level * np.random.randn(80)
    # 缓慢恢复
    signal[320:400] = np.linspace(-1.2, 0, 80) + noise_level * np.random.randn(80)
    # 右侧平稳
    signal[400:] = noise_level * np.random.randn(n-400)
    # 右侧小波包
    t = np.linspace(0, 1, 80)
    wavelet = 0.25 * np.sin(10 * np.pi * t) * np.exp(-8*(t-0.5)**2)
    signal[470:550] += wavelet
    return x, signal

def _plot_signal(signal):
    """
    绘制信号。
    参数：
        signal: 要绘制的信号数组
    """
    plt.figure(figsize=(10,2))
    plt.plot(signal, 'k', lw=2)
    plt.axis('off')
    plt.tight_layout()
    plt.show()

if __name__ == '__main__':
    x, signal = build_signal()
    _plot_signal(signal)